# 内核启动入口汇编代码
# 功能：初始化硬件、设置栈、准备C环境、跳转到C主函数

.section .text.entry
.global _entry
_entry:
    # 设置栈指针（stack_top在链接脚本中定义）
    la sp, stack_top

    # 清零BSS段
    la t0, _bss_start   # BSS段起始地址（链接脚本定义）
    la t1, _bss_end     # BSS段结束地址（链接脚本定义）
bss_clear_loop:
    bge t0, t1, bss_clear_done  # 若已到结束地址，退出循环
    sb zero, 0(t0)              # 写入0
    addi t0, t0, 1              # 移动到下一个字节
    j bss_clear_loop
bss_clear_done:

    # 跳转到C主函数（main）
    # call main
    # 跳转到机器模式启动函数
    # start函数会设置中断委托，然后通过mret跳转到supervisor模式的main()
    call start

    # 若C主函数意外返回，进入死循环
spin:
    j spin
